package com.zmn.oms.common.dro.conf.distribute;

import com.zmn.common.utils.collection.CollectionUtil;
import com.zmn.common.utils.number.NumberUtil;
import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.Collections;
import java.util.Map;

/**
 * 类描述：派单参数配置配置
 *
 * @author mujunlin
 * @since 2020/06/03 14:33
 */
@Data
public class DistributeArgsDRO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 新单简单派单：1停用，2启用
     */
    private Integer newSimpleStatus;

    /**
     * 新单自动派单：1停用，2推荐自动派单，3指定工程师自动派单，4公平自动派单
     */
    private Integer autoStatusNew;

    /**
     * 返修自动派单：1停用，2源工程师自动派
     * <p>
     * 仅针对：返修单
     */
    private Integer autoStatusRework;

    /**
     * 自动派单开始时间 格式：7:00
     */
    private String autoTimeStart;

    /**
     * 自动派单结束时间 格式：21:30
     */
    private String autoTimeEnd;

    /**
     * 最大返修单量
     * <p>
     * 不含：拉修待件
     */
    private Integer reworkLimit;

    /**
     * 最大返修催单量
     */
    private Integer reworkReminderLimit;

    /**
     * 距离权重（直营）
     * <p>
     * 距离：工程师当前位置，和当前订单的位置距离：A
     * <p>
     * 距离权重分：A≤1KM，分值100，每增加1KM分值减5，不足1KM按1KM计算，如：1.1KM算2KM。权值：分值×权重占比。
     */
    private Integer distanceWeight;

    /**
     * 手头单权重（直营）
     * <p>
     * 手头单：工程师未完成的工单数（待件&拉修除外）
     * <p>
     * 手头单权重分： (师傅最大手头单 - 手头单) / 师傅最大手头单 × 权重占比
     */
    private Integer handlerWeight;

    /**
     * 今日完成单权重（直营）
     * <p>
     * 今日完成单：今日完成的工单数
     * <p>
     * 今日完成单权重分：每完成1单，权值分增加：10分×权重占比
     */
    @Deprecated
    private Integer daySuccessWeight;

    /**
     * 上门率比重（直营）
     */
    @Deprecated
    private Integer visitRateWeight;

    /**
     * 成功率比重（直营）
     */
    @Deprecated
    private Integer successRateWeight;

    /**
     * 客单价比重（直营）
     */
    @Deprecated
    private Integer avtAmountWeight;

    /**
     * 新单派单量
     **/
    private Integer distributeNewCount;

    /**
     * 服务分
     **/
    private Integer serveScore;

    /**
     * 单时比
     **/
    private Integer datumOrderHourRatio;

    /**
     * 用户评价比重
     */
    @Deprecated
    private Integer commentWeight;

    /**
     * 星级分权重（直营）
     */
    private Integer starLevelScoreWeight;

    /**
     * 距离权重（非直营）
     * <p>
     * 距离：工程师当前位置，和当前订单的位置距离：A
     * <p>
     * 距离权重分：A≤1KM，分值100，每增加1KM分值减5，不足1KM按1KM计算，如：1.1KM算2KM。权值：分值×权重占比。
     */
    private Integer distanceWeightNon;

    /**
     * 手头单权重（非直营）
     * <p>
     * 手头单：工程师未完成的工单数（待件&拉修除外）
     * <p>
     * 手头单权重分： (师傅最大手头单 - 手头单) / 师傅最大手头单 × 权重占比
     */
    private Integer handlerWeightNon;

    /**
     * 今日完成单权重（非直营）
     * <p>
     * 今日完成单：今日完成的工单数
     * <p>
     * 今日完成单权重分：每完成1单，权值分增加：10分×权重占比
     */
    @Deprecated
    private Integer daySuccessWeightNon;

    /**
     * 上门率比重（非直营）
     */
    @Deprecated
    private Integer visitRateWeightNon;

    /**
     * 成功率比重（非直营）
     */
    @Deprecated
    private Integer successRateWeightNon;

    /**
     * 客单价比重（非直营）
     */
    @Deprecated
    private Integer avtAmountWeightNon;

    /**
     * 星级分权重（非直营）
     */
    private Integer starLevelScoreWeightNon;

    /**
     * 描述: 新单派单量
     **/
    private Integer distributeNewCountNon;

    /**
     * 描述: 服务分
     **/
    private Integer serveScoreNon;

    /**
     * 描述: 单时比
     **/
    private Integer datumOrderHourRatioNon;

    /**
     *  保护基于推荐自动派规则  1 首轮保护  2 多轮保护
     */
    private Integer autoRecommendProtectionType;

    /**
     * 首轮保护 - 产品组,工程师级别
     * Map<ProductGroupId, EngineerLevel>
     */
    private Map<Integer, Integer> protectionFirstProductGroupMap;

    /**
     *  是否配置了【多轮优先】保护：1.否 2.是
     */
    private Integer priorityProtectionStatus;

    /**
     * 多伦普通 - 默认保护次数
     */
    private Integer protectionDefaultTimes;

    /**
     *  多伦普通 - 产品组保护次数 {"1013":6,"1019":9}
     */
    private Map<String, Integer> protectionGroupTimes;

    /**
     *  多伦普通 - 保护次数 - Map<ProductGroupId, Map<EngineerLevel, Value>>
     *      工程师等级EngineerLevel：0~10
     *      EngineerLevel=100 时，是默认值
     *  为null时  取protectionGroupTimes的值
     */
    private Map<Integer, Map<Integer, Integer>> protectionTimesNormalProductGroupMap;

    /**
     *  多轮优先 - 默认保护次数
     */
    private Integer priorityProtectionDefaultTimes;

    /**
     *  多轮优先 - 产品组保护次数 {"1013":6,"1019":9}
     */
    private Map<String, Integer> priorityProtectionGroupTimes;

    /**
     *  多轮优先 保护次数-  Map<ProductGroupId, Map<EngineerLevel, Value>>
     *      工程师等级EngineerLevel：0~10
     *      EngineerLevel=100 时，是默认值
     */
    private Map<Integer, Map<Integer, Integer>> priorityProtectionTimesProductGroupMap;

    /**
     * 工程师分级准入开关：1停用，2启用
     */
    private Integer engineerLevelStatus;

    /**
     * 工程师分级准入级别
     */
    private List<Integer> engineerLevelList;

    /**
     * 工程师分级分组保护开关：1停用，2启用
     */
    private Integer engineerLevelGroupStatus;

    /**
     * 工程师分级准入分组 - 当前周配置
     */
    private List<DistributeEngineerLevelGroupDRO> engineerLevelGroupList;

    /**
     * 根据产品组ID和工程师V等级获取多轮保护轮次
     */
    public Integer getProtectionRoundsByProductGroupIdAndHierarchyLevel(Integer productGroupId, Integer hierarchyLevel) {
        Integer rounds = 0;
        // 新旧配置兼容处理
        if (CollectionUtil.isNullOrEmpty(protectionTimesNormalProductGroupMap) && CollectionUtil.isNotNullOrEmpty(protectionGroupTimes)) {
            rounds = this.protectionGroupTimes.getOrDefault(String.valueOf(productGroupId), 0);
        } else if (CollectionUtil.isNotNullOrEmpty(protectionTimesNormalProductGroupMap)) {
            Map<Integer, Integer> productGroupMap = protectionTimesNormalProductGroupMap.getOrDefault(productGroupId, Collections.emptyMap());
            if (CollectionUtil.isNotNullOrEmpty(productGroupMap) && NumberUtil.isNotNullOrZero(productGroupMap.get(hierarchyLevel))) {
                rounds = productGroupMap.get(hierarchyLevel);
            }
        }
        return rounds;
    }

    /**
     * 根据产品组ID和工程师V等级获取多轮优先保护轮次
     */
    public Integer getPriorityProtectionRoundsByProductGroupIdAndHierarchyLevel(Integer productGroupId, Integer hierarchyLevel) {
        Integer rounds = 0;
        // 新旧配置兼容处理
        if (CollectionUtil.isNullOrEmpty(priorityProtectionTimesProductGroupMap) && CollectionUtil.isNotNullOrEmpty(priorityProtectionGroupTimes)) {
            rounds = this.priorityProtectionGroupTimes.getOrDefault(String.valueOf(productGroupId), 0);
        } else if (CollectionUtil.isNotNullOrEmpty(priorityProtectionTimesProductGroupMap)) {
            Map<Integer, Integer> productGroupMap = priorityProtectionTimesProductGroupMap.getOrDefault(productGroupId, Collections.emptyMap());
            if (CollectionUtil.isNotNullOrEmpty(productGroupMap) && NumberUtil.isNotNullOrZero(productGroupMap.get(hierarchyLevel))) {
                rounds = productGroupMap.get(hierarchyLevel);
            }
        }
        return rounds;
    }
}
